package com.worksystem.Common;

import java.util.HashMap;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class BaseDao<T> implements Dao<T> {

	@Autowired
	private SessionFactory sessionFactory;

	public Session getSession() {
		return sessionFactory.getCurrentSession();
	}

	public List<T> getObjectsByhqlParameter(Query query,
		HashMap<String, Object> parameters) {
		// 赋参数进query
		for (java.util.Map.Entry<String, Object> parameter : parameters
				.entrySet()) {
			query.setParameter(parameter.getKey(), parameter.getValue());
		}
		@SuppressWarnings("unchecked")
		List<T> objects = query.list();
		return objects;
	}
	
	/**
	 * 根据hql语句来获取对象实体集合，
	 * @param hql hql语句 
	 * @param parameters  hql需要传递的参数可以为null
	 * @param start 开始位置 可以为null
	 * @param length 长度 可以为null
	 * @return
	 */
	public Query getEntityByHql(String hql,HashMap<String, Object> parameters,Integer start,Integer length){
		Query query=getSession().createQuery(hql);
		if(parameters!=null){
			for (java.util.Map.Entry<String, Object> parameter : parameters
					.entrySet()) {
				query.setParameter(parameter.getKey(), parameter.getValue());
			}
		}
		if(start!=null && length!=null){
			query=query.setFirstResult(start).setMaxResults(length);
		}
		return query;
	}
	
	/**
	 * 查询有多少条记录
	 * @param hql
	 * @param parameters 参数可以为null
	 * @return
	 */
	public Integer getEntitiessize(String hql,HashMap<String, Object> parameters){
		Query query=getSession().createQuery(hql);
		if(parameters!=null){
			for (java.util.Map.Entry<String, Object> parameter : parameters
					.entrySet()) {
				query.setParameter(parameter.getKey(), parameter.getValue());
			}
		}
		Integer count=(Integer) query.uniqueResult();
		return count;
	}
	@Override
	public void delete(Object entity) {
		getSession().delete(entity);
	}

	@Override
	public void save(Object entity) {
		getSession().save(entity);
	}

	@Override
	public void update(Object entity) {
		getSession().update(entity);
	}

}
